home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / mfra200.zip / MINIFRAC.ASM next >
Assembly Source File  |  1992-12-31  |  9KB  |  373 lines

  1.         dosseg
  2.         model small
  3.         .386
  4.  
  5.         .stack 100h
  6.  
  7.         .data
  8. vgaseg  equ     0a000h          ; place of VGA memory
  9. maxiter dd 200                  ; number of maximum iterations
  10. ar      dd 0BA000000h            ; alpha real (-2.5)
  11. ai      dd 0D1800000h            ; alpha imag (-1.5)
  12. xi      dd 05C000000h            ; delta imag (3.0)
  13. is      dd ?                    ; imag & real step
  14. zr      dd ?                    ; Z real part
  15. zi      dd ?                    ; Z imag part
  16. i2      dd ?                    ; Z imag part^2 (well, not anymore...)
  17. plx     dw ?                    ; counter for X-coordinate
  18. ply     dw ?                      ; counter for Y-coordinate
  19. cx1     dw ?                    ; x1-coord
  20. cxd     dw ?                    ; xdiff
  21. cy1     dw ?                    ;y1-coord
  22. cyd     dw ?                    ;ydiff
  23. sbuf    db 1040 dup (?)          ; save buffer for background
  24.  
  25.         .code
  26.         mov ax, dgroup
  27.         mov ds, ax
  28.         mov ax, 0013h
  29.         int 10h
  30.         mov ax, vgaseg
  31.         mov es,ax
  32. loopb:  mov ax, 320
  33.         mov plx, ax
  34.         mov ax, 200
  35.         mov ply, ax
  36.         mov eax, 147AEh           ; here begins DEEP MAGIC :->
  37.         imul xi
  38.         shrd eax, edx, 24
  39.         mov is, eax
  40.         mov di, 0
  41.         mov esi, ai
  42. loopy:  mov ebp, ar
  43. loopx:  xor ecx, ecx
  44.         mov zr, ecx
  45.         mov eax, zr
  46.         mov i2, eax
  47. loopa:  mov eax, zr             ; zi = zr/2 * zi + ai
  48.         shl eax, 1
  49.         imul zi
  50.         shrd eax, edx, 24
  51.         add eax, esi
  52.         mov zi, eax
  53.         mov eax, i2             ; zr = i2 + ar
  54.         add eax, ebp
  55.         mov zr, eax
  56.         mov ebx, eax            ; i2 = (zr+zi)(zr-zi)
  57.         add eax, zi
  58.         sub ebx, zi
  59.         imul ebx
  60.         shrd eax, edx, 24
  61.         mov i2, eax
  62.         inc ecx                 ; increment iteration counter
  63.         cmp eax, 4000000h       ; test if over 4.0 already
  64.         jg short notset               ; if, wasn't part of M-set, exit
  65.         cmp ecx, maxiter        ; if not, test if already maxiter,
  66.         jng loopa               ; if not, re-iterate,
  67.         xor ecx, ecx            ; if maxiter, then part of M-set : pixel BLACK
  68. notset: mov eax, ecx
  69.         stosb                   ; put pixel on screen and return to main
  70.         add ebp, is
  71.         dec plx
  72.         jnz short loopx
  73.         mov plx, 320
  74.         add esi, is
  75.         dec ply
  76.         jnz loopy
  77. eschk:  mov ah, 08
  78.         int 21h
  79.         cmp al, 0
  80.         jne esc1
  81.         call cs:zoom
  82.         jc eschk
  83.         jmp loopb
  84. esc1:   cmp al, "+"
  85.         jne esc2
  86.         mov eax, maxiter
  87.         add eax, 500
  88.         mov maxiter, eax
  89.         jmp loopb
  90. esc2:   cmp al, 1Bh
  91.         jne eschk
  92.         mov ax, 0003h
  93.         int 10h
  94.         mov ax, 4c00h
  95.         int 21h
  96.         endp
  97.  
  98. zoom    proc near
  99.         mov ah, 08
  100.         int 21h
  101.         cmp al, 73                      ;check for PageUp
  102.         je Yes_Zoom
  103.         stc
  104.         ret
  105. Yes_Zoom:
  106.         mov ax, 0                       ; init zoom-box parameters
  107.         mov cx1, ax
  108.         mov cy1, ax
  109.         mov ax, 320
  110.         mov cxd, ax
  111.         mov ax, 200
  112.         mov cyd, ax
  113.         call cs:drawbox
  114. zl1:    mov ah, 08
  115.         int 21h
  116.         cmp al, 13
  117.         jne no_cr
  118.         movzx ebx, cx1
  119.         mov eax, is
  120.         imul ebx
  121.         add eax, ar
  122.         mov ar, eax
  123.         movzx ebx, cy1
  124.         mov eax, is
  125.         imul ebx
  126.         add eax, ai
  127.         mov ai, eax
  128.         movzx ebx, cyd
  129.         mov eax, is
  130.         imul ebx
  131.         mov xi, eax
  132.         clc
  133.         ret
  134. no_cr:  cmp al, 1Bh
  135.         jne no_esc
  136.         mov ax, 0003h
  137.         int 10h
  138.         mov ax, 4c00h
  139.         int 21h
  140. no_esc: cmp al, 0
  141.         jne zl1
  142.         mov ah, 08
  143.         int 21h
  144.         cmp al, 72              ; Cursor up
  145.         je crsrup
  146.         cmp al, 80              ; Cursor down
  147.         je crsrdw
  148.         cmp al, 75              ; Cursor left
  149.         je crsrlt
  150.         cmp al, 77              ; Cursor right
  151.         je crsrrt
  152.         cmp al, 141             ; Ctrl-Cursor up
  153.         je crscup
  154.         cmp al, 145             ; Ctrl-Cursor down
  155.         je crscdw
  156.         cmp al, 115             ; Ctrl-Cursor left
  157.         je crsclt
  158.         cmp al, 116             ; Ctrl-Cursor right
  159.         je crscrt
  160.         cmp al, 73              ; PageUp (zoom in)
  161.         je pgup
  162.         cmp al, 81              ; PageDown (zoom out)
  163.         je pgdn
  164.         jmp zl1                 ; none of the above - test again...
  165.  
  166. crsrup: call cs:restscr
  167.         mov ax, cy1
  168.         sub ax, 5
  169.         cmp ax, 0
  170.         jge crup1
  171.         mov ax, 0
  172. crup1:  mov cy1, ax
  173.         call cs:drawbox
  174.         jmp zl1
  175.  
  176. crsrdw: call cs:restscr
  177.         mov ax, cy1
  178.         mov bx, cyd
  179.         dec bx
  180.         add ax, 5
  181.         add bx, ax
  182.         cmp bx, 199
  183.         jb crdw1
  184.         mov ax, 200
  185.         sub ax, cyd
  186. crdw1:  mov cy1, ax
  187.         call cs:drawbox
  188.         jmp zl1
  189.  
  190. crsrlt: call cs:restscr
  191.         mov ax, cx1
  192.         sub ax, 5
  193.         cmp ax, 0
  194.         jge crlt1
  195.         mov ax, 0
  196. crlt1:  mov cx1, ax
  197.         call cs:drawbox
  198.         jmp zl1
  199.  
  200. crsrrt: call cs:restscr
  201.         mov ax, cx1
  202.         mov bx, cxd
  203.         dec bx
  204.         add ax, 5
  205.         add bx, ax
  206.         cmp bx, 319
  207.         jb crrt1
  208.         mov ax, 320
  209.         sub ax, cxd
  210. crrt1:  mov cx1, ax
  211.         call cs:drawbox
  212.         jmp zl1
  213.  
  214. crscup: call cs:restscr
  215.         mov ax, cy1
  216.         dec ax
  217.         cmp ax, 0
  218.         jge ccup1
  219.         mov ax, 0
  220. ccup1:  mov cy1, ax
  221.         call cs:drawbox
  222.         jmp zl1
  223.  
  224. crscdw: call cs:restscr
  225.         mov ax, cy1
  226.         mov bx, cyd
  227.         dec bx
  228.         add ax, 1
  229.         add bx, ax
  230.         cmp bx, 199
  231.         jb ccdw1
  232.         mov ax, 200
  233.         sub ax, cyd
  234. ccdw1:  mov cy1, ax
  235.         call cs:drawbox
  236.         jmp zl1
  237.  
  238. crsclt: call cs:restscr
  239.         mov ax, cx1
  240.         dec ax
  241.         cmp ax, 0
  242.         jge cclt1
  243.         mov ax, 0
  244. cclt1:  mov cx1, ax
  245.         call cs:drawbox
  246.         jmp zl1
  247.  
  248. crscrt: call cs:restscr
  249.         mov ax, cx1
  250.         mov bx, cxd
  251.         dec bx
  252.         inc ax
  253.         add bx, ax
  254.         cmp bx, 319
  255.         jb ccrt1
  256.         mov ax, 320
  257.         sub ax, cxd
  258. ccrt1:  mov cx1, ax
  259.         call cs:drawbox
  260.         jmp zl1
  261.  
  262. pgup:   call cs:restscr
  263.         mov ax, cxd
  264.         sub ax, 10
  265.         cmp ax, 10
  266.         jg pgup1
  267.         mov ax, 10
  268.         sub cx1, 5
  269.         sub cy1, 3
  270. pgup1:  mov cxd, ax
  271.         movzx eax, ax
  272.         lea eax, [eax+eax*4]
  273.         shr eax, 3
  274.         mov cyd, ax
  275.         add cx1, 5
  276.         add cy1, 3
  277.         call cs:drawbox
  278.         jmp zl1
  279.  
  280. pgdn:   call cs:restscr
  281.         mov ax, cxd
  282.         add ax, 10
  283.         cmp ax, 310
  284.         jl pgdn1
  285.         mov ax, 310
  286.         add cx1, 5
  287.         add cy1, 3
  288. pgdn1:  mov cxd, ax
  289.         movzx eax, ax
  290.         lea eax, [eax+eax*4]
  291.         shr eax, 3
  292.         mov cyd, ax
  293.         sub cx1, 5
  294.         sub cy1, 3
  295.         call cs:drawbox
  296.         jmp zl1
  297.  
  298.  
  299.  
  300.         endp
  301.  
  302. drawbox proc near                       ; draw the fucking zoom-box
  303.         mov ax, cy1
  304.         lea eax, [eax+eax*4]
  305.         shl eax, 6
  306.         add ax, cx1
  307.         mov di, ax                      ; but keep the background
  308.         mov cx, cxd
  309.         mov al, 15
  310. drl1:   mov bl, es:[di]
  311.         mov ds:[di][sbuf], bl
  312.         stosb
  313.         loop drl1
  314.         add di, 320
  315.         sub di, cxd
  316.         mov cx, cyd
  317.         sub cx, 2
  318. drl2:   mov bl, es:[di]
  319.         mov ds:[di][sbuf], bl
  320.         stosb
  321.         add di,cxd
  322.         sub di,2
  323.         mov bl, es:[di]
  324.         mov ds:[di][sbuf], bl
  325.         stosb
  326.         add di, 320
  327.         sub di, cxd
  328.         loop drl2
  329.         mov cx, cxd
  330. drl3:   mov bl, es:[di]
  331.         mov ds:[di][sbuf], bl
  332.         stosb
  333.         loop drl3
  334.         ret
  335.         endp
  336.  
  337. restscr proc near                       ; restore background screen
  338.         mov ax, cy1
  339.         lea eax, [eax+eax*4]
  340.         shl eax, 6
  341.         add ax, cx1
  342.         mov di, ax
  343.         mov cx, cxd
  344.         mov al, 15
  345. rrl1:   mov bl, ds:[di][sbuf]
  346.         mov es:[di], bl
  347.         inc di
  348.         loop rrl1
  349.         add di, 320
  350.         sub di, cxd
  351.         mov cx, cyd
  352.         sub cx, 2
  353. rrl2:   mov bl, ds:[di][sbuf]
  354.         mov es:[di], bl
  355.         inc di
  356.         add di,cxd
  357.         sub di,2
  358.         mov bl, ds:[di][sbuf]
  359.         mov es:[di], bl
  360.         inc di
  361.         add di, 320
  362.         sub di, cxd
  363.         loop rrl2
  364.         mov cx, cxd
  365. rrl3:   mov bl, ds:[di][sbuf]
  366.         mov es:[di], bl
  367.         inc di
  368.         loop rrl3
  369.         ret
  370.         endp
  371.  
  372.         END
  373.